 

"""
Please note, this code is only for python 3+. If you are using python 2+, please modify the code accordingly.
"""
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

def add_layer(inputs, in_size, out_size, activation_function=None):
    Weights = tf.Variable(tf.random_normal([in_size, out_size]))#变量权重是用tf生成in_size行和out_size列的矩阵
    biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)#用tf生成1行out_size列的0矩阵，并且机器学习中推荐的值是不为0的，所以加上0.1
    Wx_plus_b = tf.matmul(inputs, Weights) + biases#输入乘以权重 + biases，预测出来但是还未被激活的值存放在Wx_plus_b
    if activation_function is None:#判断是否有激活函数
        outputs = Wx_plus_b #线性关系
    else:
        outputs = activation_function(Wx_plus_b)#将Wx_plus_b传入激活函数
    return outputs

# Make up some real data
x_data = np.linspace(-1, 1, 300)[:, np.newaxis]#-1到1区间，有300（行）个单位，加一个维度
noise = np.random.normal(0, 0.05, x_data.shape)#加入噪点，使得y_data不是严格的一元二次函数，x_data.shape表明是和x_data一样的格式
y_data = np.square(x_data) - 0.5 + noise #x_data二次方， 没有

##plt.scatter(x_data, y_data)
##plt.show()

# define placeholder for inputs to network
xs = tf.placeholder(tf.float32, [None, 1])#传入值，先定义在run的时候再传入，x_data的属性特征只有1
ys = tf.placeholder(tf.float32, [None, 1])#同上，x_data的属性只有1，None，无论给多少个例子都可以
# add hidden layer
l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)#定义隐藏层，输入为xs，输入值xs大小，输出隐藏层有10个神经元，激励函数为非线性的方程
# add output layer
prediction = add_layer(l1, 10, 1, activation_function=None)#输出层，输出层的输入即为layer1，10大小，输出就为输出层的大小为1

# the error between prediciton and real data
#                求平均       每个例子求和    平方 真实-预测
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction), reduction_indices=[1]))#预测和真实值的差别
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)#梯度下降优化器来训练，学习效率0.1，最小化均方差
# important step
init = tf.global_variables_initializer()#对所有变量进行初始化，非常重要！
sess= tf.Session() #定义Session
sess.run(init)     #run才开始运算

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.scatter(x_data,y_data)
plt.ion()#plot以后会暂停程序，在为了不暂停，继续往下走
plt.show()#plt.show(block =false)

for i in range(1000):#重复100次
    # training
    sess.run(train_step, feed_dict={xs: x_data, ys: y_data})#传入实际值给定义的传入值，传入的实际值就是x_data和y_data
    if i % 50 == 0:
        try:
           ax.lines.remove(lines[0])#为了看清楚话的线，删除line的第一线段
        except Exception:#第一次没有线生成，忽略掉第一次
           pass
        prediction_value = sess.run(prediction,feed_dict = {xs: x_data})
        lines = ax.plot(x_data,prediction_value,'r-',lw=5)#用一条红色宽度为5的曲线的
        plt.pause(0.1) 
